372
4361
Mikä on nopein tapa muuntaa java.nio.ByteBuffer a (uudeksi luoduksi) CharBuffer b: ksi tai char [] b: ksi.
Tekemällä tämän on tärkeää, että a [i] == b [i]. Tämä tarkoittaa, että ei [i] ja [i + 1] yhdessä muodosta arvoa b [j], mitä getChar (i) tekisi, mutta arvot tulisi "levittää".
tavu a [] = {1,2,3, 125,126,127, -128, -127, -126} // kukin tavu (jotka on allekirjoitettu)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // kukin char (jotka ovat allekirjoittamattomia)
Huomaa, että tavulla: -128 on samat (alemmat 8) bittiä kuin char: 128: lla. Siksi oletan, että "paras" tulkinta olisi sellainen kuin totesin sen edellä, koska bitit ovat samat.
Sen jälkeen tarvitsen myös päinvastoin: tehokkaimman tavan saada char [] tai java.nio.CharBuffer takaisin java.nio.ByteBufferiksi. 
Joten mitä haluat muuntaa käyttämällä koodausta ISO-8859-1.
En väitä mitään tehokkuudesta, mutta ainakin se on melko lyhyt kirjoittaa:
CharBuffer-tulos = Charset.forName ("ISO-8859-1"). Dekoodaa (byteBuffer);
Toinen suunta olisi:
ByteBuffer-tulos = Charset.forName ("ISO-8859-1"). Koodaa (charBuffer);
Mittaa tätä muihin ratkaisuihin nähden. (Oikeudenmukaisuuden vuoksi Charset.forName-osaa ei pitäisi sisällyttää, ja se tulisi tehdä myös vain kerran, ei kullekin puskurille uudelleen.)
Java 7: stä eteenpäin on myös StandardCharsets-luokka, jossa on ennakoituja Charset-esiintymiä, joten voit käyttää
CharBuffer-tulos = StandardCharsets.ISO_8859_1.decode (byteBuffer);
ja
TavuBuffer-tulos = StandardCharsets.ISO_8859_1.encode (charBuffer);
sen sijaan. (Nämä rivit tekevät samoin kuin aikaisemmat, vain haku on helpompaa, eikä nimien väärinkirjoitukseen ole vaaraa, eikä mahdottomia poikkeuksia tarvitse kiinni.)
|
Olisin samaa mieltä @ Ishtarin kanssa, ehdotan, että vältetään lainkaan muuntaminen uudeksi rakenteeksi ja muunnetaan vain tarpeen mukaan.
Jos sinulla on kuitenkin kasa ByteBuffer, voit tehdä.
TavuPuskuri bb = ...
tavu [] taulukko = bb.haara ();
char [] merkit = uusi char [bb.remaining ()];
for (int i = 0; i